/**
 * @fileoverview app-updater.js
 * @description app的更新模块
 * @attention mainWindow.webContents.send是给渲染进程发送消息
 */

import log from 'electron-log' //引入打印方法
import { autoUpdater } from 'electron-updater' //引入自动更新
import { app, ipcMain } from 'electron' //引入需要操作的内容
import { join } from 'path' // 引入路径模块
export default (mainWindow) => {
    developmentMethod()
    // 配置项
    autoUpdater.logger = log // 打印日志
    autoUpdater.logger.transports.file.level = 'info' // 日志等级
    autoUpdater.autoDownload = false // 设置为false，不自动下载
    autoUpdater.autoInstallOnAppQuit = false // APP退出的时候自动安装
    const appVersion = app.getVersion() //获取当前版本号

    // 监听渲染进程加载完成事件
    ipcMain.on('window-onLoaded', () => {
        mainWindow.webContents.send('now-app-version', appVersion) // 告诉渲染进程当前的版本号
        autoUpdater.checkForUpdates() // 检查更新 -- 必须执行，否则监听无效
        log.info('执行检查更新') // 打印日志
    })

    // 获取版本信息
    autoUpdater.on('checking-for-update', () => {
        log.info('获取当前版本信息:', appVersion)
    })

    // 监听更新事件
    autoUpdater.on('update-available', (res) => {
        // 获取当前新版本信息
        const newAppInfo = {
            version: res.version, // 版本号
            size: res.files[0].size, // 文件大小
            releaseDate: res.path.releaseDate //发布日期
        }
        mainWindow.webContents.send('update_available', true, newAppInfo)
        log.info('拥有可更新版本:' + JSON.stringify(res))
    })

    // 监听没有更新的版本
    autoUpdater.on('update-not-available', () => {
        mainWindow.webContents.send('update_available', false)
        log.info('没有需要可更新版本')
    })

    // 监听渲染进程发现进行app更新事件
    ipcMain.on('download_app', () => {
        autoUpdater.downloadUpdate()
        log.info('执行了更新下载的操作')
    })

    // 监听下载的事件内容，用于进度条展示
    autoUpdater.on('download-progress', (res) => {
        mainWindow.webContents.send('downloadProgress', res)
        log.info('下载监听内容:' + JSON.stringify(res))
    })

    // 下载完成的回调
    autoUpdater.on('update-downloaded', () => {
        log.info('下载完成')
        // mainWindow.webContents.send('update_downloaded')
        autoUpdater.quitAndInstall(false)
    })
}

// 这个文件是关乎开发环境测试的重点---请勿删除
const developmentMethod = () => {
    // 是否是测试环境，是就执行，不是就忽略
    const isDevelopment = process.env.NODE_ENV === 'development'
    // 防止报错no such file or directory dev-app-update.yml
    if (isDevelopment) {
        // 允许在开发测试环境下进行更新调用测试
        Object.defineProperty(app, 'isPackaged', {
            get() {
                return true
            }
        })
        // 指定开发环境测试文件，否则不好使
        autoUpdater.updateConfigPath = join(__dirname, '../../dev-app-update.yml')
    }
}
